﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Negocio = PSE.Tools.CadastroMensagens.Negocio;
using NegocioProdutos = PSE.Tools.CadastroProdutos.Negocio;
using Entidades = PSE.Tools.CadastroMensagens.Entidades;
using EntidadesProdutos = PSE.Tools.CadastroProdutos.Entidades;
using Apresentacao = PSE.Tools.CadastroMensagens.Apresentacao;
using PSE.Tools.Util.Entidades;
namespace Web.Paginas
{
    public partial class Resources : Base.PaginaBase, Apresentacao.IApresentacao
    {
        #region [ Variaveis ]
        private Apresentacao.Resources _apresentacao;
        #endregion [ Variaveis ]

        #region [ Construtores ]
        public Resources()
        {
            _apresentacao = new Apresentacao.Resources(this, new Negocio.Resources());
        }
        #endregion [ Construtores ]

        #region [ Eventos ]
        protected override void OnLoad(EventArgs e)
        {
            lnkNovo.Click += new EventHandler(lnkNovo_Click);
            lnkCancelar.Click += new EventHandler(lnkCancelar_Click);

            btnInserir.Click += new ImageClickEventHandler(btnInserir_Click);

            grid.ItemCommand += new RepeaterCommandEventHandler(grid_ItemCommand);

            chkGerarException.CheckedChanged += new EventHandler(chkGerarException_CheckedChanged);
            if (!IsPostBack)
            {
                IniciaMensagens();
                IniciaTiposMensagem();
                IniciaProduto();
                IniciaGrid();
            }
        }

        protected void chkGerarException_CheckedChanged(object sender, EventArgs e)
        {
            ManipulaCamposExcecao(chkGerarException.Checked);
        }

        protected void grid_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            int id = 0;
            int.TryParse(e.CommandArgument.ToString(), out id);
            if (e.CommandName.Equals("Editar"))
            {
                Carregar(id);
            }
            if (e.CommandName.Equals("Excluir"))
            {
                Excluir(id);
            }
        }

        protected void btnInserir_Click(object sender, ImageClickEventArgs e)
        {
            Salvar();
        }

        protected void lnkNovo_Click(object sender, EventArgs e)
        {
            Novo();
        }

        protected void lnkCancelar_Click(object sender, EventArgs e)
        {
            Cancelar();
        }
        #endregion [ Eventos ]

        #region [ Métodos ]

        private void Salvar()
        {
            bool retorno = false;
            Entidades.Resource resource = new Entidades.Resource();

            int id = 0;
            int.TryParse(txtId.Value, out id);
            resource.Id = id;

            int idMensagem = 0;
            int.TryParse(ddlTipoMensagem.SelectedValue, out idMensagem);
            Negocio.Mensagens negocioMensagem = new Negocio.Mensagens();
            //resource.ListaMensagens = negocioMensagem.ObterPorId(idMensagem).FirstOrDefault();

            int idProduto = 0;
            int.TryParse(ddlProduto.SelectedValue, out idProduto);
            NegocioProdutos.Produtos negocioProdutos = new NegocioProdutos.Produtos();
            resource.Produto = negocioProdutos.ObterPorId(idProduto);

            int idTipoMensagem = 0;
            int.TryParse(ddlTipoMensagem.SelectedValue, out idTipoMensagem);
            Negocio.TiposMensagens negocioTiposProduto = new Negocio.TiposMensagens();
            resource.TipoMensagem = negocioTiposProduto.ObterPorId(idTipoMensagem);
            resource.ResourceKey = txtResourceKey.Text;

            if (string.IsNullOrEmpty(txtId.Value))
                retorno = _apresentacao.Inserir(resource);
            else
                retorno = _apresentacao.Atualizar(resource);

            if (retorno)
                IniciaGrid();

            form.Visible = !retorno;
        }

        private void LimparCampos()
        {
            txtId.Value = string.Empty;
            ddlMensagens.ClearSelection();
            lblMensagens.Text = string.Empty;
            ddlTipoMensagem.ClearSelection();
            lblTipoMensagem.Text = string.Empty;
            ddlProduto.ClearSelection();
            lblProduto.Text = string.Empty;
            txtResourceKey.Text = string.Empty;
            lblResourceKey.Text = string.Empty;
            txtException.Visible = false;
            lblException.Visible = false;
            lblTituloException.Visible = false;
            txtException.Text = string.Empty;
            lblException.Text = string.Empty;
            chkGerarException.Checked = false;
            txtIdExcecao.Value = string.Empty;
        }

        private void ManipulaCamposExcecao(bool mostrar)
        {
            txtException.Visible = mostrar;
            lblException.Visible = mostrar;
            lblTituloException.Visible = mostrar;
            chkGerarException.Checked = mostrar;
        }


        private void Novo()
        {
            LimparCampos();
            form.Visible = true;
        }

        private void Carregar(int id)
        {
            Novo();
            Entidades.Resource resource = _apresentacao.Obter(id);
            txtId.Value = resource.Id.ToString();
            txtResourceKey.Text = resource.ResourceKey;

            ddlProduto.ClearSelection();
            ddlTipoMensagem.ClearSelection();
            ddlMensagens.ClearSelection();

            ListItem produto = ddlProduto.Items.FindByValue(resource.Produto.Id.ToString());
            if (produto != null)
                produto.Selected = true;

            ListItem tipoMensagem = ddlTipoMensagem.Items.FindByValue(resource.TipoMensagem.Id.ToString());
            if (tipoMensagem != null)
                tipoMensagem.Selected = true;

            //ListItem mensagem = ddlMensagens.Items.FindByValue(resource.Mensagem.Id.ToString());
            //if (mensagem != null)
            //{
            //    mensagem.Selected = true;
            //    txtException.Text = mensagem.Text;
            //}

            Negocio.Excecoes negocioExcecao = new Negocio.Excecoes();
            var entidadeExcecao = negocioExcecao.ObterPorResourceKey(resource.ResourceKey);

            ManipulaCamposExcecao(entidadeExcecao != null);
            if (entidadeExcecao != null)
            {
                txtIdExcecao.Value = entidadeExcecao.Id.ToString();
                txtException.Text = entidadeExcecao.Mensagem;
            }
        }

        private void Excluir(int id)
        {
            Entidades.Resource resource = _apresentacao.Obter(id);
            _apresentacao.Excluir(resource);
            IniciaGrid();
        }

        private void Cancelar()
        {
            LimparCampos();
            form.Visible = false;
            lblMensagem.Text = "";
        }

        private void IniciaProduto()
        {
            NegocioProdutos.Produtos negocio = new NegocioProdutos.Produtos();
            ddlProduto.DataBind(negocio.Selecionar(), "Nome", "Id");
        }

        private void IniciaTiposMensagem()
        {
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            ddlTipoMensagem.DataBind(negocio.Selecionar(), "Descricao", "Id");
        }

        private void IniciaMensagens()
        {
            Negocio.Mensagens negocio = new Negocio.Mensagens();
            ddlMensagens.DataBind(negocio.Selecionar(m => m.Idioma.Sigla.Equals("pt-br")), "TextoMensagem", "Id");
        }

        private void IniciaGrid()
        {
            Negocio.Resources negocio = new Negocio.Resources();
            Negocio.Excecoes negocioExcecao = new Negocio.Excecoes();
            var itens = negocio.Selecionar(new Entidades.ResourceFiltro());
            grid.DataSource = itens.Select(r => new
            {
                Id = r.Id,
                ResourceKey = r.ResourceKey,
                Produto = r.Produto.Nome,
                //Mensagem = r.Mensagem.TextoMensagem,
                TipoMensagem = r.TipoMensagem.Descricao,
                Exception = negocioExcecao.ObterPorResourceKey(r.ResourceKey)
            });
            grid.DataBind();
            lblQtdItens.Text = itens.Count.ToString();
        }

        public void EnviarMensagem(string mensagem)
        {
            lblMensagem.Text = mensagem;
            lblMensagem.CssClass = "fraseDestaque sucesso";
        }

        public void EnviarMensagemErro(string mensagem)
        {
            lblMensagem.Text = mensagem;
            lblMensagem.CssClass = "fraseDestaque erro";
        }

        public void EnviarMensagemValidacao(IEnumerable<ValidacaoEntidade> validacoes)
        {
            foreach (var validacao in validacoes)
                EnviarMensagemValidacao(validacao);
        }

        public void EnviarMensagemValidacao(ValidacaoEntidade validacao)
        {
            if (validacao.NomePropriedade == "Mensagem")
            {
                lblMensagem.CssClass = "atencao";
                lblMensagem.Text = validacao.Mensagem;
            }
            if (validacao.NomePropriedade == "TipoMensagem")
            {
                lblTipoMensagem.CssClass = "atencao";
                lblTipoMensagem.Text = validacao.Mensagem;
            }
            if (validacao.NomePropriedade == "Produto")
            {
                lblProduto.CssClass = "atencao";
                lblProduto.Text = validacao.Mensagem;
            }
            if (validacao.NomePropriedade == "ResourceKey")
            {
                lblResourceKey.CssClass = "atencao";
                lblResourceKey.Text = validacao.Mensagem;
            }

            lblMensagem.CssClass = "fraseDestaque atencao";
            lblMensagem.Text = "Verifique os campos abaixo...";
        }
        #endregion [ Métodos ]
    }
}
